/*
 * cm_buddy.h
 *
 *  Created on: Sep 18, 2015
 *      Author: song
 */

#ifndef MEMORY_CM_BUDDY_ALG_H_
#define MEMORY_CM_BUDDY_ALG_H_

#define ALLOC   malloc

struct buddy2;

#ifdef __cplusplus
extern "C" {
#endif

/*
 * @brief   分配一个内存管理用的结构体（伙伴系统）
 * @param   size表示一共需要管理多少个内存块， size必须是2的幂次，否则创建失败
 * @return  失败返回NULL 成功返回非NULL
 */
struct buddy2* buddy2_new(int size);

/*
 * @brief   分配size个块的内存，返回块的偏移
 * @param   self: 通过buddy2_new创建的管理结构体
 * @param   size: 需要分配的块的个数
 * @return  分配成功则返回 起始块的偏移 且该块处连续size个块可用， 失败返回-1
 */
int buddy2_alloc(struct buddy2* self, int size);

/*
 * @brief   释放已经分配了的块
 * @param   self: 分配块时使用的管理结构体
 * @param   offset: 通过buddy2_alloc返回的 offset
 */
void buddy2_free(struct buddy2* self, int offset);

#ifdef __cplusplus
}
#endif

#endif /* MEMORY_CM_BUDDY_ALG_H_ */
